什么是Git中的合并冲突以及如何处理它 您所在的位置:网站首页 git 冲突怎么解决 什么是Git中的合并冲突以及如何处理它

什么是Git中的合并冲突以及如何处理它

2024-04-03 12:01| 来源: 网络整理| 查看: 265

这篇文章是我们"高级Git "系列的一部分。请务必在Twitter上关注Tower,或者注册他们的新闻通讯,以了解下一篇文章的情况。

合并冲突......没有人喜欢它们。我们中的一些人甚至害怕它们。但当你使用Git时,它们是生活中的一个事实,特别是当你与其他开发者合作时。在大多数情况下,合并冲突并不像你想象的那么可怕。在"高级Git "系列的第四部分,我们将讨论什么时候会发生冲突,它们到底是什么,以及如何解决它们。

高级Git系列。 第一部分: 在Git中创建完美的提交 第二部分: Git中的分支策略 第三部分: 用拉动请求进行更好的协作 第四部分: 合并冲突*(You are here!*) **第五部分:**Rebase与Merge (即将推出!) **第六部分:**交互式重做 **第7部分:**在Git中挑选提交的内容 第8部分:在Git中挑选提交使用回溯日志来恢复丢失的提交 合并冲突是如何以及何时发生的

从名字上就可以看出:当你把不同来源的修改整合(或 "合并")到当前工作分支时,就会发生合并冲突。请记住,整合并不局限于合并分支。冲突也可能发生在重构或交互式重构过程中,当你在Git中挑选时(即当你从一个分支中选择一个提交并应用于另一个分支时),当你运行git pull ,甚至在重新应用一个储藏库时。

所有这些操作都会进行某种整合,这时就会发生合并冲突。当然,这并不意味着这些动作中的每一个都会导致合并冲突--谢天谢地!但冲突究竟何时发生?但冲突究竟何时发生?

事实上,Git的合并能力是它最大的优势之一:大多数时候,合并分支的工作都是完美无缺的,因为Git通常能够自己搞清楚问题,知道如何整合修改。

但在有些情况下,会出现相互矛盾的改动--这时技术根本无法决定什么是对的或错的。这些情况需要人的决定。例如,当完全相同的一行代码在两个提交中被修改,在两个不同的分支上,Git没有办法知道你更喜欢哪一个修改。另一种情况比较少见:一个文件在一个分支中被修改,在另一个分支中被删除。Git 会问你该怎么做,而不是仅仅猜测什么最有效。

如何知道何时发生了合并冲突

那么,你怎么知道发生了合并冲突?不用担心--Git 会告诉你,它还会就如何解决这个问题提出建议。如果合并或重构失败,它会立即让你知道。例如,如果你提交的修改与别人的修改有冲突,Git会在终端通知你这个问题,并告诉你自动合并失败。

$ git merge develop CONFLICT (content): Merge conflict in index.html Automatic merge failed; fix conflicts and then commit the result.

你可以看到我在这里遇到了冲突,而且Git马上就告诉我这个问题。即使我错过了那条信息,在我下次输入git status 时也会提醒我这个冲突。

如果你使用的是像Tower这样的Git桌面GUI,这个应用可以确保你不会忽略任何冲突。

在任何情况下:不要担心没有注意到合并冲突!

如何撤销合并冲突并重新开始

你不能忽视一个合并冲突--相反,你必须在继续你的工作之前处理好它。你基本上有以下两种选择。

解决冲突 放弃或撤消导致冲突的操作

在我们讨论解决冲突之前,让我们简单地谈谈如何撤销和重新开始(知道这是可能的,这很让人放心)。在许多情况下,这就像使用--abort 参数一样简单,例如在git merge --abort 和git rebase --abort 等命令中。这将撤消合并/rebase,恢复到冲突发生前的状态。

当你已经开始解决冲突的文件时,这也是有效的,即使如此,当你发现自己处于死胡同时,你仍然可以撤消合并。这应该给你信心,你真的不可能搞砸。你可以随时中止,回到一个干净的状态,然后重新开始。

Git中的合并冲突到底是什么样子的

让我们看看冲突在引擎盖下到底是什么样子的。现在是时候揭开这些小家伙的神秘面纱,让我们更好地了解它们。一旦你了解了合并冲突,你就可以不再担心了。

作为一个例子,让我们看一下目前有冲突的index.html 文件的内容。

Screenshot of an open code editor with HTML markup for a navigation that contains an unordered list of links. There are three lines of text injected by Git, the first says HEAD, the second is a line of equals signs, and the last says develop.

Git很好地标记了文件中的问题区域。它们被 所包围。第一个标记之后的内容来自于我们当前的工作分支(HEAD )。有七个等号的那一行 (=======) 分开了两个相互冲突的修改。最后,显示的是另一个分支的修改(在我们的例子中是develop )。

你的工作是清理这些行并解决冲突:在文本编辑器中,在你喜欢的IDE中,在Git桌面GUI中,或者在Diff&Merge工具中。

如何解决Git中的冲突

使用哪种工具或应用程序来解决合并冲突并不重要--当你完成后,文件必须和你想要的样子完全一样。如果只有你一个人,你可以很容易地决定去掉一个代码变更。但如果冲突的改动来自于其他人,你可能要和他们谈谈,然后再决定保留哪个代码。也许是你的,也许是别人的,也许是这两者的结合。

清理文件并确保它包含你真正想要的东西,这个过程不需要涉及任何魔法。你可以简单地通过打开你的文本编辑器或集成开发环境并进行修改来做到这一点。

但有时,你会发现这并不是最有效的方法。这时,专门的工具就可以节省时间和精力。例如,在解决合并冲突时,有各种Git桌面GUI可以帮助你。

让我们以Tower为例。它提供了一个专门的 "冲突向导",使这些原本抽象的情况更加直观。这有助于更好地理解变化来自哪里,发生了什么类型的修改,并最终解决这个问题。

特别是对于更复杂的冲突,有一个专门的Diff & Merge工具在手,会非常好。它可以帮助你更好地理解差异,因为它提供了一些高级功能,如特殊的格式化和不同的表现模式(如并排的,合并在一列的,等等)。

市场上有几个 Diff & Merge工具(这里有一些用于Mac和Windows的)。你可以使用git config 命令来配置你选择的工具。(详细说明请查阅该工具的文档。)在发生冲突的情况下,你可以通过简单地输入git mergetool 来调用它。作为一个例子,我在我的Mac上使用Kaleidoscope应用程序。

在清理完文件后--可以在文本编辑器中手动清理,也可以在 Git 桌面 GUI 中清理,还可以使用合并工具--你可以像其他修改一样提交该文件。通过键入git add ,你通知 Git 冲突已经解决。

当所有的合并冲突都被解决并添加到暂存区域时,你只需创建一个普通的提交。这样就完成了冲突的解决。

不要惊慌!

正如你所看到的,合并冲突没什么好担心的,当然也没有理由惊慌失措。一旦你了解了导致冲突的实际情况,你就可以决定撤销修改或解决冲突。记住,你不能破坏事情--即使你在解决冲突时意识到你犯了一个错误,你仍然可以撤销它:只要回滚到大灾难发生前的提交,重新开始。

如果你想深入了解先进的Git工具,请随时查看我的(免费的!) "Advanced Git Kit":它是一个关于分支策略、交互式重做、Reflog、子模块等主题的简短视频集。

高级Git系列。 第一部分。 在Git中创建完美的提交 第二部分: Git中的分支策略 第三部分: 用拉动请求进行更好的协作 第四部分: 合并冲突*(You are here!*) **第5部分:**重构与合并 (即将推出!) **第六部分:**交互式重做 **第七部分:**在Git中挑选提交的内容 第8部分:在Git中挑选提交使用Reflog来恢复丢失的提交


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有